#!/bin/bash
# GR3 All-In-One - Wi-Fi設定(初回のみ) + 自動接続 + 写真取り込み + 電源OFF
#
# 初回、または設定ファイルがない場合は自動でWi-Fi設定ダイアログを表示します。
# 2回目以降は保存済み設定でそのまま取り込みまで進みます。
# 設定を変更したい場合は、GR3のオプションキーを押しながら起動する代わりに
# 「Wi-Fi設定を変更しますか？」のダイアログで「変更する」を選んでください。

CONFIG_DIR="$HOME/Library/Application Support/GR3Import"
CONFIG_FILE="$CONFIG_DIR/config.conf"
SAVE="$HOME/Pictures/GR3import"
mkdir -p "$CONFIG_DIR" "$SAVE"

close_window() {
    read -n 1
    osascript -e 'tell application "Terminal" to close (first window whose tty is "'"$(tty)"'")' >/dev/null 2>&1 &
}

notify() {
    osascript -e "display notification \"$2\" with title \"$1\"" >/dev/null 2>&1
}

json_parse() {
    osascript -l JavaScript -e "
        var data = JSON.parse(\`$1\`);
        $2
    " 2>/dev/null
}

echo "=== GR3 Import ==="
echo ""

# ---------- 1. Wi-Fi設定(初回 or 変更依頼時のみ) ----------
NEED_SETUP=0
if [ ! -f "$CONFIG_FILE" ]; then
    NEED_SETUP=1
else
    # shellcheck disable=SC1090
    source "$CONFIG_FILE"
    CHOICE=$(osascript -e 'button returned of (display dialog "GR3のWi-Fi設定「'"${GR3_SSID}"'」を使用します。" buttons {"変更する", "このまま進む"} default button "このまま進む" with title "GR3 Import")' 2>/dev/null)
    [ "$CHOICE" = "変更する" ] && NEED_SETUP=1
fi

if [ "$NEED_SETUP" = "1" ]; then
    CURRENT_SSID=""
    CAMERA_URL_DEFAULT="http://192.168.0.1"
    if [ -f "$CONFIG_FILE" ]; then
        # shellcheck disable=SC1090
        source "$CONFIG_FILE"
        CURRENT_SSID="$GR3_SSID"
        [ -n "$CAMERA_URL" ] && CAMERA_URL_DEFAULT="$CAMERA_URL"
    fi

    SSID=$(osascript -e "text returned of (display dialog \"GR3のWi-FiのSSIDを入力してください\" default answer \"${CURRENT_SSID}\" with title \"GR3 Wi-Fi設定\")" 2>/dev/null)
    if [ -z "$SSID" ]; then
        echo "キャンセルされました。"
        echo "何かキーを押すと終了します..."
        close_window
        exit 1
    fi

    PASSWORD=$(osascript -e "text returned of (display dialog \"GR3のWi-Fiパスワードを入力してください\" default answer \"\" with title \"GR3 Wi-Fi設定\" with hidden answer)" 2>/dev/null)
    if [ -z "$PASSWORD" ]; then
        echo "キャンセルされました。"
        echo "何かキーを押すと終了します..."
        close_window
        exit 1
    fi

    cat > "$CONFIG_FILE" << EOF
GR3_SSID="${SSID}"
CAMERA_URL="${CAMERA_URL_DEFAULT}"
RESTORE_WIFI="1"
EOF

    security delete-generic-password -a "GR3Import" -s "GR3Import-${SSID}" >/dev/null 2>&1
    security add-generic-password -a "GR3Import" -s "GR3Import-${SSID}" -w "${PASSWORD}" -U >/dev/null 2>&1

    echo "保存しました: SSID=${SSID}"
    echo ""
fi

# ---------- 2. 設定読み込み ----------
# shellcheck disable=SC1090
source "$CONFIG_FILE"
CAMERA="${CAMERA_URL:-http://192.168.0.1}"

if [ -z "$GR3_SSID" ]; then
    echo "ERROR: SSIDが設定されていません。"
    close_window
    exit 1
fi

GR3_PASSWORD=$(security find-generic-password -a "GR3Import" -s "GR3Import-${GR3_SSID}" -w 2>/dev/null)
if [ -z "$GR3_PASSWORD" ]; then
    echo "ERROR: 保存されたWi-Fiパスワードが見つかりません。"
    close_window
    exit 1
fi

# ---------- 3. Wi-Fi自動接続 ----------
WIFI_DEV=$(networksetup -listallhardwareports | awk '/Wi-Fi/{getline; print $2}')
if [ -z "$WIFI_DEV" ]; then
    echo "ERROR: Wi-Fiデバイスが見つかりません"
    close_window
    exit 1
fi

PREV_SSID=$(networksetup -getairportnetwork "$WIFI_DEV" 2>/dev/null | sed 's/^Current Wi-Fi Network: //')
case "$PREV_SSID" in
    "You are not associated with an AirPort network."*) PREV_SSID="" ;;
esac
[ "$PREV_SSID" = "$GR3_SSID" ] && PREV_SSID=""

echo "GR3のWi-Fi「${GR3_SSID}」に接続中..."
networksetup -setairportpower "$WIFI_DEV" on >/dev/null 2>&1
networksetup -setairportnetwork "$WIFI_DEV" "$GR3_SSID" "$GR3_PASSWORD" >/dev/null 2>&1

props=""
CONNECTED=0
for i in $(seq 1 45); do
    props=$(curl -s --connect-timeout 2 "${CAMERA}/v1/props" 2>/dev/null)
    if [ -n "$props" ]; then
        CONNECTED=1
        break
    fi
    if [ "$i" -eq 15 ]; then
        networksetup -setairportnetwork "$WIFI_DEV" "$GR3_SSID" "$GR3_PASSWORD" >/dev/null 2>&1
    fi
    sleep 1
done

if [ "$CONNECTED" != "1" ]; then
    echo "ERROR: GR3に接続できませんでした(45秒待機)"
    notify "GR3 Import" "接続失敗"
    close_window
    exit 1
fi

model=$(json_parse "$props" "data.model")
echo "接続OK: ${model}"
echo ""

# ---------- 4. 写真取り込み ----------
echo "写真一覧取得中..."
photos=$(curl -s "${CAMERA}/v1/photos" 2>/dev/null)
if [ -z "$photos" ]; then
    echo "ERROR: 写真一覧の取得に失敗"
    notify "GR3 Import" "写真一覧の取得に失敗"
    close_window
    exit 1
fi

total=$(json_parse "$photos" "var t=0; data.dirs.forEach(function(d){t+=d.files.length}); t")
echo "全${total}ファイル"
echo ""

ok=0; skip=0; fail=0

if [ "$total" != "0" ]; then
    dir_count=$(json_parse "$photos" "data.dirs.length")
    for ((i=0; i<dir_count; i++)); do
        dir_name=$(json_parse "$photos" "data.dirs[$i].name")
        file_count=$(json_parse "$photos" "data.dirs[$i].files.length")
        mkdir -p "${SAVE}/${dir_name}"
        for ((j=0; j<file_count; j++)); do
            fname=$(json_parse "$photos" "data.dirs[$i].files[$j]")
            dest="${SAVE}/${dir_name}/${fname}"
            if [ -f "$dest" ]; then
                echo "SKIP: ${fname}"
                ((skip++))
                continue
            fi
            curl -s -o "$dest" "${CAMERA}/v1/photos/${dir_name}/${fname}"
            if [ -f "$dest" ]; then
                echo "OK: ${fname}"
                ((ok++))
            else
                echo "FAIL: ${fname}"
                ((fail++))
            fi
        done
    done
else
    echo "写真がありません"
fi

echo ""
echo "=== 完了 ==="
echo "保存先: ${SAVE}"
echo "DL: ${ok} / スキップ: ${skip} / 失敗: ${fail}"

# ---------- 5. 電源OFF・Wi-Fi復帰 ----------
curl -s -X POST -H "Content-Type: application/json" -d '{}' "${CAMERA}/v1/device/finish" >/dev/null 2>&1
echo "カメラの電源をオフにしました"

if [ "${RESTORE_WIFI:-1}" = "1" ] && [ -n "$PREV_SSID" ]; then
    echo "元のWi-Fi「${PREV_SSID}」に戻しています..."
    sleep 2
    networksetup -setairportnetwork "$WIFI_DEV" "$PREV_SSID" >/dev/null 2>&1
fi

notify "GR3 Import" "取り込み完了: OK ${ok} / SKIP ${skip} / FAIL ${fail}"

echo ""
echo "何かキーを押すとウィンドウを閉じます..."
close_window
exit
